#include <iostream>
#include <assert.h>

#include "lambda/lambda.hpp"

using namespace night::lambda;

struct A {
  int i; 
  A (int n) : i(n) {};

  int add0 () { return i; }
  int add1 (const int& j) { return i + j; }
  int add2 (int a1, int a2) const { return i + a1 + a2; }

};

int main ()
{
	arg<1> fn;

	int i=1, j=2, k=3;

	A a ( 0 );
	A * ptr = &a;

	fun(x) [ bind (&A::i, x) = 10 ] (a);
	assert ( bind (&A::i, x) (a) == 10 );
	assert ( bind (&A::i, x) (ptr) == 10 );
	assert ( bind (&A::add0, x) (a) == 10 );
	assert ( bind (&A::add0, x) (ptr) == 10 );
	assert ( bind (&A::add1, a, x) (i) == 11 );
	assert ( bind (&A::add1, ptr, x) (i) == 11 );
	assert ( bind (&A::add1, x, j) (a) == 12 );
	assert ( bind (&A::add1, x, j) (ptr) == 12 );
	assert ( bind (&A::add2, x, j, k) (a) == 15 );
	assert ( bind (&A::add2, x, j, k) (ptr) == 15 );

}

